import { AppConfig } from '@config/app.config';
import { Update_Status_Enum } from '@enum/app.enum';
import { Ipc_ChannelEnum } from '@enum/channel.enum';
import { Ipc } from '@main/helper/ipcMain';
import { autoUpdater, type ProgressInfo } from 'electron-updater'


interface AutoUpdaterListenOptions {
    
    status:Update_Status_Enum;
    message:string;
    progressObj?:ProgressInfo;
   
}

export class UpdateService {

    //更新上传信息
    static sendUpdateMations(params:AutoUpdaterListenOptions):void {
        Ipc.send({
            key:Ipc_ChannelEnum.APP_UPDATE_MATIONS,
            params
        })
    }

    //监听更新ipc
    static autoUpdate():void {
        Ipc.on(Ipc_ChannelEnum.APP_CHECK_UPDATE,()=>{
            Update.autoUpdate()
            
        })
    }

    //监听下载
    static downloadUpdate():void {
        Ipc.on(Ipc_ChannelEnum.APP_CHECK_UPDATE,()=>{
            Update.downloadUpdate()
        })
    }

    //监听安装ipc
    static quitAndInstall():void {
        Ipc.on(Ipc_ChannelEnum.APP_CHECK_UPDATE,()=>{
            Update.quitAndInstall()
        })
    }

    static on():void {
        this.autoUpdate()
        this.downloadUpdate()
        this.quitAndInstall()
    }

}

export class Update {
    
    private static readonly  _feedUrl : string = AppConfig.SERVICE_URL + AppConfig.UPDATE_BASE_API;

    private static readonly _updateTips : Array<{status:number,message:string}> = [
        { status : Update_Status_Enum.START_UPDATE , message : '正在检查更新' },
        { status : Update_Status_Enum.NEW_VERSION , message : '检测到新版本，准备下载' },
        { status : Update_Status_Enum.NO_VERSION , message : '未检测到新版本' },
        { status : Update_Status_Enum.IS_DOWNLOADING , message : '下载中' },
        { status : Update_Status_Enum.DOWNLOAD_SUCCESS , message : '下载完成' },
        { status : Update_Status_Enum.CHECK_UPDATE_ERROR , message : '检查更新失败' },
        { status : Update_Status_Enum.DOWNLOAD_ERROR , message : '下载失败' }
    ]

    //开始更新
    static autoUpdate(feeedUrl:string = this._feedUrl):void {

        autoUpdater.setFeedURL(feeedUrl)

        this.mountListens()

        this.checkForUpdates()

    }

    //挂载监听
    static mountListens() : void {

        // 当开始检查更新的时候触发
        autoUpdater.on('checking-for-update', () => {
            this.sendMations(Update_Status_Enum.START_UPDATE)
        })
    
        // 发现可更新数据时
        autoUpdater.on('update-available', () => {
            this.sendMations(Update_Status_Enum.NEW_VERSION)
            autoUpdater.downloadUpdate().catch((err)=>{
            });
        })
    
        // 没有可更新数据时
        autoUpdater.on('update-not-available', () => {
            this.sendMations(Update_Status_Enum.NO_VERSION)
        })
    
        // 下载监听
        autoUpdater.on('download-progress', (progressObj) => {
            this.sendMations(Update_Status_Enum.IS_DOWNLOADING,progressObj)
        })
    
        // 下载完成
        autoUpdater.on('update-downloaded', () => {
            this.sendMations(Update_Status_Enum.DOWNLOAD_SUCCESS)
        })    
    }

    //检查新版本
    static checkForUpdates():void {

        autoUpdater.checkForUpdates().catch(err => {
            console.error('检查更新失败：', err)
            this.sendMations(Update_Status_Enum.CHECK_UPDATE_ERROR)
          })
    }

    //下载新版本
    static downloadUpdate():void {

        autoUpdater.downloadUpdate().catch((err)=>{
            console.error('下载新版本失败：', err)
            this.sendMations(Update_Status_Enum.DOWNLOAD_ERROR)

        }); 
    }

    //退出并安装
    static quitAndInstall():void {

        autoUpdater.quitAndInstall()
    }

    //更新信息    
    static sendMations(status:Update_Status_Enum,progressObj?:ProgressInfo):void {

        const message = this._updateTips.find(tip => tip.status === status)?.message

        if(message){
            
            UpdateService.sendUpdateMations({
                status,
                message,
                progressObj
            })

        }else throw new Error ('请使用正确的更新码值，当前码值：' + status)
        
    }
  
}

